﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Data.SqlClient;
using GestorDeFlotasDesktop.Classes;

namespace GestorDeFlotasDesktop.AbmAuto
{
    public partial class formTaxi : Form
    {
        public formTaxi()
        {
            InitializeComponent();
            populateMarca();
            populateReloj();
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            boxLicencia.Text = string.Empty;
            boxPatente.Text = string.Empty;
            boxModelo.Text = string.Empty;
        }

        private void populateMarca()
        {
            SqlInterface.Conectar();
            SqlDataReader MarcaReader = SqlInterface.ExecuteReader(
                "SELECT DISTINCT TAXI_MARCA FROM SQUIRTLE.TAXI", CommandType.Text);

            List<String> listaMarcas = new List<string>();
            while (MarcaReader.Read())
            {
                listaMarcas.Add(MarcaReader.GetString(MarcaReader.GetOrdinal("TAXI_MARCA")));
            }
            listaMarcas.Insert(0,"(Ninguna)");
            cmbMarca.DataSource = listaMarcas;
            SqlInterface.Desconectar();
        }

        private void populateReloj()
        {
            SqlInterface.Conectar();
            SqlDataReader RelojReader = SqlInterface.ExecuteReader(
                "SELECT DISTINCT RELOJ_CODIGO,RELOJ_NROSERIE FROM SQUIRTLE.RELOJ WHERE RELOJ_HABILITADO=1", CommandType.Text);

            List<Reloj> listaRelojes = new List<Reloj>();
            while (RelojReader.Read())
            {
                Reloj reloj = new Reloj();
                reloj.intReloj = RelojReader.GetInt32(RelojReader.GetOrdinal("RELOJ_CODIGO"));
                reloj.strNroSerie = RelojReader.GetString(RelojReader.GetOrdinal("RELOJ_NROSERIE"));
                listaRelojes.Add(reloj);
            }
            listaRelojes.Insert(0, crearRelojVacio());
            cmbReloj.DataSource = listaRelojes;
            cmbReloj.DisplayMember = "strNroSerie";
            cmbReloj.ValueMember = "intReloj";
            SqlInterface.Desconectar();
        }

        private Reloj crearRelojVacio()
        {
            Reloj reloj = new Reloj();
            reloj.strNroSerie = "(Ninguno)";
            return reloj;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            List<SqlParameter> Parameters = new List<SqlParameter>();

            if (boxLicencia.Text == string.Empty)
                Parameters.Add(new SqlParameter("@licencia", DBNull.Value));
            else
                Parameters.Add(new SqlParameter("@licencia", boxLicencia.Text));

            if (boxPatente.Text == string.Empty)
                Parameters.Add(new SqlParameter("@patente", DBNull.Value));
            else
                Parameters.Add(new SqlParameter("@patente", boxPatente.Text));

            if (boxModelo.Text == string.Empty)
                Parameters.Add(new SqlParameter("@modelo", DBNull.Value));
            else
                Parameters.Add(new SqlParameter("@modelo", boxModelo.Text));

            if ((cmbMarca.SelectedItem.ToString()).Equals("(Ninguna)"))
                Parameters.Add(new SqlParameter("@marca", DBNull.Value));
            else
                Parameters.Add(new SqlParameter("@marca", cmbMarca.GetItemText(this.cmbMarca.SelectedItem)));

            if ((cmbReloj.GetItemText(this.cmbReloj.SelectedItem)).Equals("(Ninguno)"))
                Parameters.Add(new SqlParameter("@reloj", DBNull.Value));
            else
                Parameters.Add(new SqlParameter("@reloj", cmbReloj.GetItemText(cmbReloj.SelectedValue)));

            SqlInterface.Conectar();
            SqlDataReader TaxiConRelojReader;
            TaxiConRelojReader = SqlInterface.ExecuteReader("SQUIRTLE.spBuscarTaxiConReloj", CommandType.StoredProcedure, Parameters);
            if (TaxiConRelojReader.HasRows)
            {
                DataTable tablaResultado = new DataTable();
                tablaResultado.Load(TaxiConRelojReader);
                gridResultados.DataSource = tablaResultado;
                gridResultados.Columns[0].Visible = false; //Oculta la PK del Taxi
                //gridResultados.Columns[1].Visible = false; //Oculta la PK del Reloj
            }
            else
            {
                MessageBox.Show("No hay taxi que cumpla con la búsqueda.");
            }
            SqlInterface.Desconectar();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            Form formNuevoTaxi = new NuevoTaxi();
            formNuevoTaxi.Show();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (gridResultados.SelectedRows.Count > 1)
            {
                MessageBox.Show("Solo esta permitido elegir un taxi por vez.");
                return;
            }

            List<SqlParameter> Parameters = new List<SqlParameter>();
            Auto taxi = new Auto();
            int index = gridResultados.SelectedCells[0].RowIndex;
            taxi.intCodigo = Convert.ToInt32(gridResultados["TAXI_CODIGO", index].Value);
            traerCodigoReloj(taxi);
            // (WARNING: relojCodigo no esta mas en la busqueda standard. Hay que traerlo de la base si es neceario.) Solucionado!!!
            Parameters.Add(new SqlParameter("@codigo", taxi.intCodigo)); //PK del Taxi
            Parameters.Add(new SqlParameter("@reloj",taxi.intCodigoReloj)); //PK del Reloj

            SqlInterface.Conectar();
            int resultado = SqlInterface.ExecuteNonQuery("SQUIRTLE.spBajaTaxi", CommandType.StoredProcedure, Parameters);
            if (resultado == -1)
                MessageBox.Show("No se ha podido eliminar el taxi solicitado.");
            else
                MessageBox.Show("El taxi ha sido eliminado con éxito.");

            Parameters.Clear();
            SqlInterface.Desconectar();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (gridResultados.SelectedRows.Count > 1)
            {
                MessageBox.Show("Solo esta permitido elegir un taxi por vez.");
                return;
            }

            Auto taxi = new Auto();
            int index = gridResultados.SelectedCells[0].RowIndex;
            taxi.intCodigo = Convert.ToInt32(gridResultados["TAXI_CODIGO", index].Value);
            taxi.strLicencia = Convert.ToString(gridResultados["TAXI_LICENCIA", index].Value);
            taxi.strMarca = Convert.ToString(gridResultados["TAXI_MARCA", index].Value);
            taxi.strModelo = Convert.ToString(gridResultados["TAXI_MODELO", index].Value);
            taxi.strPatente = Convert.ToString(gridResultados["TAXI_PATENTE", index].Value);
            taxi.strRodado = Convert.ToString(gridResultados["TAXI_RODADO", index].Value);
            taxi.blnHabilitado = Convert.ToBoolean(gridResultados["TAXI_HABILITADO", index].Value);
            // WARNING: Hay que traer su reloj de la base al intentar modifcarlo!!!
            // taxi.strRelojNroSerie = Convert.ToString(gridResultados["RELOJ_CODIGO", index].Value);
            // La linea "traerReloj(taxi);" reemplaza a la anterior a este comentario y soluciona el warning.
            traerSerieReloj(taxi);

            Form modificionForm = new NuevoTaxi(taxi);
            modificionForm.Show();
        }

        private void traerSerieReloj(Auto a)
        {
            SqlInterface.Conectar();
            SqlDataReader RelojReader = SqlInterface.ExecuteReader("SELECT RELOJ_NROSERIE FROM SQUIRTLE.RELOJ INNER JOIN SQUIRTLE.AUTO_RELOJ ON AUTO_RELOJ_RELOJ=RELOJ_CODIGO WHERE AUTO_RELOJ_HABILITADO=1 AND AUTO_RELOJ_AUTO=" + Convert.ToString(a.intCodigo), CommandType.Text);

            if (RelojReader.HasRows)
            {
                RelojReader.Read();
                a.strRelojNroSerie = RelojReader.GetString(RelojReader.GetOrdinal("RELOJ_NROSERIE"));
            }
            else
            {
                a.strRelojNroSerie = "(Ninguno)";
            }
        }

        private void traerCodigoReloj(Auto a)
        {
            SqlInterface.Conectar();
            SqlDataReader RelojReader = SqlInterface.ExecuteReader("SELECT AUTO_RELOJ_RELOJ FROM SQUIRTLE.AUTO_RELOJ WHERE AUTO_RELOJ_HABILITADO=1 AND AUTO_RELOJ_AUTO=" + Convert.ToString(a.intCodigo), CommandType.Text);

            if (RelojReader.HasRows)
            {
                RelojReader.Read();
                a.intCodigoReloj = RelojReader.GetInt32(RelojReader.GetOrdinal("AUTO_RELOJ_RELOJ"));
            }
            else
            {
                a.intCodigoReloj = -1;
            }
        }
    }
}
